package org.example;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.util.FileUtils;
import org.apache.ibatis.annotations.Mapper;

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Main {
//	public static void main(String[] args) {
//		// 请调整为你的项目路径
//		String projectBaseDir = "F:\\Users\\alphah\\holykell";
//		// 作者名
//		String author = "bobo";
//		// 表前缀，生成出来的实体不会有这个前缀
//		String tablePrefix = "holykell_";
//		// 要生成的表
//		List<String> tableList = Arrays.asList("holykell_device_zt");
//
//		if (tableList.isEmpty()) {
//			throw new RuntimeException("生成表列表不能为空");
//		}
//		// 摘要打印
//		StringBuilder print = new StringBuilder("\n=================代码生成器=================\n\t" +
//				"版本 0.0.2 \n\t" +
//				"项目路径 " + projectBaseDir + "\n\t" +
//				"表前缀 " + tablePrefix + "\n\t");
//		print.append("------------------------\n\t");
//		for (int i = 0; i < tableList.size(); i++) {
//			if (i == tableList.size() - 1) {
//				print.append("生成表 ").append(tableList.get(i)).append("\n");
//			} else {
//				print.append("生成表 ").append(tableList.get(i)).append("\n\t");
//			}
//		}
//		print.append("=================代码生成器=================");
//		System.out.println(print);
//		FastAutoGenerator.create(
//						"jdbc:mysql://192.168.1.246:3308/holykell",
//						"root",
//						"Yunmell668")
//				.globalConfig(builder -> {
//					builder.author(author) // 设置作者
////							.enableSwagger() // 开启 swagger 模式
//							.enableSpringdoc()
//							.outputDir(projectBaseDir + "\\holykell-server\\src\\main\\java"); // 指定输出目录
//				})
//				.packageConfig(builder -> {
//					builder.parent("com.holykell.server") // 设置父包名
//							.moduleName("") // 设置父包模块名
//							.entity("domain")
//							.pathInfo(Collections.singletonMap(OutputFile.xml, projectBaseDir + "\\holykell-server\\src\\main\\resources\\mapper")); // 设置mapperXml生成路径
//				})
//				.strategyConfig(builder -> {
//					tableList.forEach(builder::addInclude);
//					builder
//							.addTablePrefix(tablePrefix)
//							.entityBuilder()
//							.enableLombok() //开启 Lombok
////							.enableFileOverride() // 覆盖已生成文件
//							.naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略：下划线转驼峰命
//							.columnNaming(NamingStrategy.underline_to_camel)    //数据库表字段映射到实体的命名策略：下划线转驼峰命
//							// Mapper 策略配置
//							.mapperBuilder().mapperAnnotation(Mapper.class)
////							.enableFileOverride() // 覆盖已生成文件
//							// Service 策略配置
//							.serviceBuilder()
////							.enableFileOverride() // 覆盖已生成文件
//							.formatServiceFileName("%sService") //格式化 service 接口文件名称，%s进行匹配表名，如 UserService
//							.formatServiceImplFileName("%sServiceImpl") //格式化 service 实现类文件名称，%s进行匹配表名，如 UserServiceImpl
//							// Controller 策略配置
//							.controllerBuilder()
//							.enableRestStyle()
//							.enableFileOverride(); // 覆盖已生成文件
//				})
//				.templateConfig(builder -> {
//					builder.entity("template/entity.java");
//					builder.controller("template/controller.java");
//				})
//				.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
//				.execute();
//	}

	public static void main(String[] args) throws IOException {
		// 请调整为你的项目路径
		String projectBaseDir = "C:\\Users\\10420\\Desktop\\mybatis-gennerator\\";

		Path folder = Paths.get(projectBaseDir);
        if (Files.exists(folder)) {
            // 递归删除文件夹及其内容
            Files.walkFileTree(folder, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                        throws IOException {
                    Files.deleteIfExists(file);
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc)
                        throws IOException {
                    Files.deleteIfExists(dir);
                    return FileVisitResult.CONTINUE;
                }
            });
        }



		// 作者名
		String author = "bobo";
		// 表前缀，生成出来的实体不会有这个前缀
		String tablePrefix = "";
		// 要生成的表
		List<String> tableList = Arrays.asList(
				"system_data_factory_sync_config",
                "system_sync_schedule_rule"
		);

        String database = "ruoyi-vue-pro";
        String username = "root";
        String password = "Yunmell668";
        String packagePath = "com.yunmell.server.v2.data_factory_sync";

        // 摘要打印
		StringBuilder print = new StringBuilder("\n=================代码生成器=================\n\t" +
				"版本 0.0.2 \n\t" +
				"项目路径 " + projectBaseDir + "\n\t" +
				"表前缀 " + tablePrefix + "\n\t");
		print.append("------------------------\n\t");
		for (int i = 0; i < tableList.size(); i++) {
			if (i == tableList.size() - 1) {
				print.append("生成表 ").append(tableList.get(i)).append("\n");
			} else {
				print.append("生成表 ").append(tableList.get(i)).append("\n\t");
			}
		}
		print.append("=================代码生成器=================");
		System.out.println(print);
		FastAutoGenerator.create(
						"jdbc:mysql://www.nw.com:3308/" + database,
                        username,
						password)
				.globalConfig(builder -> {
					builder.author(author) // 设置作者
//							.enableSwagger() // 开启 swagger 模式
//							.enableSpringdoc()
							.outputDir(projectBaseDir + "\\app"); // 指定输出目录
				})
				.packageConfig(builder -> {
					builder.parent(packagePath) // 设置父包名
							.moduleName("") // 设置父包模块名
							.entity("entity")
							.pathInfo(Collections.singletonMap(OutputFile.xml, projectBaseDir + "\\mapper")); // 设置mapperXml生成路径
				})
				.strategyConfig(builder -> {
					tableList.forEach(builder::addInclude);
					builder
							.addTablePrefix(tablePrefix)
							.entityBuilder()
							.enableLombok() //开启 Lombok
//							.enableFileOverride() // 覆盖已生成文件
							.naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略：下划线转驼峰命
							.columnNaming(NamingStrategy.underline_to_camel)    //数据库表字段映射到实体的命名策略：下划线转驼峰命
							// Mapper 策略配置
							.mapperBuilder().mapperAnnotation(Mapper.class)
//							.enableFileOverride() // 覆盖已生成文件
							// Service 策略配置
							.serviceBuilder()
//							.enableFileOverride() // 覆盖已生成文件
							.formatServiceFileName("%sService") //格式化 service 接口文件名称，%s进行匹配表名，如 UserService
							.formatServiceImplFileName("%sServiceImpl") //格式化 service 实现类文件名称，%s进行匹配表名，如 UserServiceImpl
							// Controller 策略配置
							.controllerBuilder()
							.enableRestStyle()
							.enableFileOverride(); // 覆盖已生成文件
				})
				.templateConfig(builder -> {
					builder.entity("template/entity.java");
					builder.controller("template/controller.java");
				})
				.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
				.execute();
	}
}